home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / LINUX / BLK.H < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-17  |  11.9 KB  |  458 lines

  1. #ifndef _BLK_H
  2. #define _BLK_H
  3.  
  4. #include <linux/blkdev.h>
  5. #include <linux/locks.h>
  6. #include <linux/config.h>
  7.  
  8. #include <asm/spinlock.h>
  9.  
  10. /*
  11.  * Spinlock for protecting the request queue which
  12.  * is mucked around with in interrupts on potentially
  13.  * multiple CPU's..
  14.  */
  15. extern spinlock_t io_request_lock;
  16.  
  17. /*
  18.  * NR_REQUEST is the number of entries in the request-queue.
  19.  * NOTE that writes may use only the low 2/3 of these: reads
  20.  * take precedence.
  21.  */
  22. #define NR_REQUEST    64
  23.  
  24. /*
  25.  * This is used in the elevator algorithm.  We don't prioritise reads
  26.  * over writes any more --- although reads are more time-critical than
  27.  * writes, by treating them equally we increase filesystem throughput.
  28.  * This turns out to give better overall performance.  -- sct
  29.  */
  30. #define IN_ORDER(s1,s2) \
  31. ((s1)->rq_dev < (s2)->rq_dev || (((s1)->rq_dev == (s2)->rq_dev && \
  32. (s1)->sector < (s2)->sector)))
  33.  
  34. /*
  35.  * Initialization functions.
  36.  */
  37. extern int isp16_init(void);
  38. extern int cdu31a_init(void);
  39. extern int acsi_init(void);
  40. extern int mcd_init(void);
  41. extern int mcdx_init(void);
  42. extern int sbpcd_init(void);
  43. extern int aztcd_init(void);
  44. extern int sony535_init(void);
  45. extern int gscd_init(void);
  46. extern int cm206_init(void);
  47. extern int optcd_init(void);
  48. extern int sjcd_init(void);
  49. extern int cdi_init(void);
  50. extern int hd_init(void);
  51. extern int ide_init(void);
  52. extern int xd_init(void);
  53. extern int mfm_init(void);
  54. extern int loop_init(void);
  55. extern int md_init(void);
  56. extern int ap_init(void);
  57. extern int ddv_init(void);
  58. extern int z2_init(void);
  59. extern int swim3_init(void);
  60. extern int amiga_floppy_init(void);
  61. extern int atari_floppy_init(void);
  62. extern int nbd_init(void);
  63. extern int ez_init(void);
  64. extern int bpcd_init(void);
  65. extern int ps2esdi_init(void);
  66.  
  67. extern void set_device_ro(kdev_t dev,int flag);
  68. void add_blkdev_randomness(int major);
  69.  
  70. extern int floppy_init(void);
  71. extern void rd_load(void);
  72. extern int rd_init(void);
  73. extern int rd_doload;        /* 1 = load ramdisk, 0 = don't load */
  74. extern int rd_prompt;        /* 1 = prompt for ramdisk, 0 = don't prompt */
  75. extern int rd_image_start;    /* starting block # of image */
  76.  
  77. #ifdef CONFIG_BLK_DEV_INITRD
  78.  
  79. #define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */
  80.  
  81. extern unsigned long initrd_start,initrd_end;
  82. extern int mount_initrd; /* zero if initrd should not be mounted */
  83. extern int initrd_below_start_ok; /* 1 if it is not an error if initrd_start < memory_start */
  84. void initrd_init(void);
  85.  
  86. #endif
  87.  
  88. #define RO_IOCTLS(dev,where) \
  89.   case BLKROSET: { int __val;  if (!capable(CAP_SYS_ADMIN)) return -EACCES; \
  90.            if (get_user(__val, (int *)(where))) return -EFAULT; \
  91.            set_device_ro((dev),__val); return 0; } \
  92.   case BLKROGET: { int __val = (is_read_only(dev) != 0) ; \
  93.             return put_user(__val,(int *) (where)); }
  94.          
  95. #if defined(MAJOR_NR) || defined(IDE_DRIVER)
  96.  
  97. /*
  98.  * Add entries as needed.
  99.  */
  100.  
  101. #ifdef IDE_DRIVER
  102.  
  103. #define DEVICE_NR(device)    (MINOR(device) >> PARTN_BITS)
  104. #define DEVICE_ON(device)    /* nothing */
  105. #define DEVICE_OFF(device)    /* nothing */
  106. #define DEVICE_NAME "ide"
  107.  
  108. #elif (MAJOR_NR == RAMDISK_MAJOR)
  109.  
  110. /* ram disk */
  111. #define DEVICE_NAME "ramdisk"
  112. #define DEVICE_REQUEST rd_request
  113. #define DEVICE_NR(device) (MINOR(device))
  114. #define DEVICE_ON(device) 
  115. #define DEVICE_OFF(device)
  116. #define DEVICE_NO_RANDOM
  117.  
  118. #elif (MAJOR_NR == Z2RAM_MAJOR)
  119.  
  120. /* Zorro II Ram */
  121. #define DEVICE_NAME "Z2RAM"
  122. #define DEVICE_REQUEST do_z2_request
  123. #define DEVICE_NR(device) (MINOR(device))
  124. #define DEVICE_ON(device)
  125. #define DEVICE_OFF(device)
  126.  
  127. #elif (MAJOR_NR == FLOPPY_MAJOR)
  128.  
  129. static void floppy_off(unsigned int nr);
  130.  
  131. #define DEVICE_NAME "floppy"
  132. #define DEVICE_INTR do_floppy
  133. #define DEVICE_REQUEST do_fd_request
  134. #define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 ))
  135. #define DEVICE_ON(device)
  136. #define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))
  137.  
  138. #elif (MAJOR_NR == HD_MAJOR)
  139.  
  140. /* Hard disk:  timeout is 6 seconds. */
  141. #define DEVICE_NAME "hard disk"
  142. #define DEVICE_INTR do_hd
  143. #define DEVICE_TIMEOUT HD_TIMER
  144. #define TIMEOUT_VALUE (6*HZ)
  145. #define DEVICE_REQUEST do_hd_request
  146. #define DEVICE_NR(device) (MINOR(device)>>6)
  147. #define DEVICE_ON(device)
  148. #define DEVICE_OFF(device)
  149.  
  150. #elif (SCSI_DISK_MAJOR(MAJOR_NR))
  151.  
  152. #define DEVICE_NAME "scsidisk"
  153. #define DEVICE_INTR do_sd  
  154. #define TIMEOUT_VALUE (2*HZ)
  155. #define DEVICE_REQUEST do_sd_request
  156. #define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4))
  157. #define DEVICE_ON(device)
  158. #define DEVICE_OFF(device)
  159.  
  160. /* Kludge to use the same number for both char and block major numbers */
  161. #elif  (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)
  162.  
  163. #define DEVICE_NAME "Multiple devices driver"
  164. #define DEVICE_REQUEST do_md_request
  165. #define DEVICE_NR(device) (MINOR(device))
  166. #define DEVICE_ON(device)
  167. #define DEVICE_OFF(device)
  168.  
  169. #elif (MAJOR_NR == SCSI_TAPE_MAJOR)
  170.  
  171. #define DEVICE_NAME "scsitape"
  172. #define DEVICE_INTR do_st  
  173. #define DEVICE_NR(device) (MINOR(device) & 0x7f)
  174. #define DEVICE_ON(device)
  175. #define DEVICE_OFF(device)
  176.  
  177. #elif (MAJOR_NR == SCSI_CDROM_MAJOR)
  178.  
  179. #define DEVICE_NAME "CD-ROM"
  180. #define DEVICE_INTR do_sr
  181. #define DEVICE_REQUEST do_sr_request
  182. #define DEVICE_NR(device) (MINOR(device))
  183. #define DEVICE_ON(device)
  184. #define DEVICE_OFF(device)
  185.  
  186. #elif (MAJOR_NR == XT_DISK_MAJOR)
  187.  
  188. #define DEVICE_NAME "xt disk"
  189. #define DEVICE_REQUEST do_xd_request
  190. #define DEVICE_NR(device) (MINOR(device) >> 6)
  191. #define DEVICE_ON(device)
  192. #define DEVICE_OFF(device)
  193.  
  194. #elif (MAJOR_NR == PS2ESDI_MAJOR)
  195.  
  196. #define DEVICE_NAME "PS/2 ESDI"
  197. #define DEVICE_REQUEST do_ps2esdi_request
  198. #define DEVICE_NR(device) (MINOR(device) >> 6)
  199. #define DEVICE_ON(device)
  200. #define DEVICE_OFF(device)
  201.  
  202. #elif (MAJOR_NR == CDU31A_CDROM_MAJOR)
  203.  
  204. #define DEVICE_NAME "CDU31A"
  205. #define DEVICE_REQUEST do_cdu31a_request
  206. #define DEVICE_NR(device) (MINOR(device))
  207. #define DEVICE_ON(device)
  208. #define DEVICE_OFF(device)
  209.  
  210. #elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE))
  211.  
  212. #define DEVICE_NAME "ACSI"
  213. #define DEVICE_INTR do_acsi
  214. #define DEVICE_REQUEST do_acsi_request
  215. #define DEVICE_NR(device) (MINOR(device) >> 4)
  216. #define DEVICE_ON(device)
  217. #define DEVICE_OFF(device)
  218.  
  219. #elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)
  220.  
  221. #define DEVICE_NAME "Mitsumi CD-ROM"
  222. /* #define DEVICE_INTR do_mcd */
  223. #define DEVICE_REQUEST do_mcd_request
  224. #define DEVICE_NR(device) (MINOR(device))
  225. #define DEVICE_ON(device)
  226. #define DEVICE_OFF(device)
  227.  
  228. #elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR)
  229.  
  230. #define DEVICE_NAME "Mitsumi CD-ROM"
  231. /* #define DEVICE_INTR do_mcdx */
  232. #define DEVICE_REQUEST do_mcdx_request
  233. #define DEVICE_NR(device) (MINOR(device))
  234. #define DEVICE_ON(device)
  235. #define DEVICE_OFF(device)
  236.  
  237. #elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)
  238.  
  239. #define DEVICE_NAME "Matsushita CD-ROM controller #1"
  240. #define DEVICE_REQUEST do_sbpcd_request
  241. #define DEVICE_NR(device) (MINOR(device))
  242. #define DEVICE_ON(device)
  243. #define DEVICE_OFF(device)
  244.  
  245. #elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)
  246.  
  247. #define DEVICE_NAME "Matsushita CD-ROM controller #2"
  248. #define DEVICE_REQUEST do_sbpcd2_request
  249. #define DEVICE_NR(device) (MINOR(device))
  250. #define DEVICE_ON(device)
  251. #define DEVICE_OFF(device)
  252.  
  253. #elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)
  254.  
  255. #define DEVICE_NAME "Matsushita CD-ROM controller #3"
  256. #define DEVICE_REQUEST do_sbpcd3_request
  257. #define DEVICE_NR(device) (MINOR(device))
  258. #define DEVICE_ON(device)
  259. #define DEVICE_OFF(device)
  260.  
  261. #elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)
  262.  
  263. #define DEVICE_NAME "Matsushita CD-ROM controller #4"
  264. #define DEVICE_REQUEST do_sbpcd4_request
  265. #define DEVICE_NR(device) (MINOR(device))
  266. #define DEVICE_ON(device)
  267. #define DEVICE_OFF(device)
  268.  
  269. #elif (MAJOR_NR == AZTECH_CDROM_MAJOR)
  270.  
  271. #define DEVICE_NAME "Aztech CD-ROM"
  272. #define DEVICE_REQUEST do_aztcd_request
  273. #define DEVICE_NR(device) (MINOR(device))
  274. #define DEVICE_ON(device)
  275. #define DEVICE_OFF(device)
  276.  
  277. #elif (MAJOR_NR == CDU535_CDROM_MAJOR)
  278.  
  279. #define DEVICE_NAME "SONY-CDU535"
  280. #define DEVICE_INTR do_cdu535
  281. #define DEVICE_REQUEST do_cdu535_request
  282. #define DEVICE_NR(device) (MINOR(device))
  283. #define DEVICE_ON(device)
  284. #define DEVICE_OFF(device)
  285.  
  286. #elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR)
  287.  
  288. #define DEVICE_NAME "Goldstar R420"
  289. #define DEVICE_REQUEST do_gscd_request
  290. #define DEVICE_NR(device) (MINOR(device))
  291. #define DEVICE_ON(device)
  292. #define DEVICE_OFF(device)
  293.  
  294. #elif (MAJOR_NR == CM206_CDROM_MAJOR)
  295. #define DEVICE_NAME "Philips/LMS CD-ROM cm206"
  296. #define DEVICE_REQUEST do_cm206_request
  297. #define DEVICE_NR(device) (MINOR(device))
  298. #define DEVICE_ON(device)
  299. #define DEVICE_OFF(device)
  300.  
  301. #elif (MAJOR_NR == OPTICS_CDROM_MAJOR)
  302.  
  303. #define DEVICE_NAME "DOLPHIN 8000AT CD-ROM"
  304. #define DEVICE_REQUEST do_optcd_request
  305. #define DEVICE_NR(device) (MINOR(device))
  306. #define DEVICE_ON(device)
  307. #define DEVICE_OFF(device)
  308.  
  309. #elif (MAJOR_NR == SANYO_CDROM_MAJOR)
  310.  
  311. #define DEVICE_NAME "Sanyo H94A CD-ROM"
  312. #define DEVICE_REQUEST do_sjcd_request
  313. #define DEVICE_NR(device) (MINOR(device))
  314. #define DEVICE_ON(device)
  315. #define DEVICE_OFF(device)
  316.  
  317. #elif (MAJOR_NR == APBLOCK_MAJOR)
  318.  
  319. #define DEVICE_NAME "apblock"
  320. #define DEVICE_REQUEST ap_request
  321. #define DEVICE_NR(device) (MINOR(device))
  322. #define DEVICE_ON(device) 
  323. #define DEVICE_OFF(device)
  324.  
  325. #elif (MAJOR_NR == DDV_MAJOR)
  326.  
  327. #define DEVICE_NAME "ddv"
  328. #define DEVICE_REQUEST ddv_request
  329. #define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS)
  330. #define DEVICE_ON(device) 
  331. #define DEVICE_OFF(device)
  332.  
  333. #elif (MAJOR_NR == MFM_ACORN_MAJOR)
  334.  
  335. #define DEVICE_NAME "mfm disk"
  336. #define DEVICE_INTR do_mfm
  337. #define DEVICE_REQUEST do_mfm_request
  338. #define DEVICE_NR(device) (MINOR(device) >> 6)
  339. #define DEVICE_ON(device)
  340. #define DEVICE_OFF(device)
  341.  
  342. #elif (MAJOR_NR == MFM_ACORN_MAJOR)
  343.  
  344. #define DEVICE_NAME "mfm disk"
  345. #define DEVICE_INTR do_mfm
  346. #define DEVICE_REQUEST do_mfm_request
  347. #define DEVICE_NR(device) (MINOR(device) >> 6)
  348. #define DEVICE_ON(device)
  349. #define DEVICE_OFF(device)
  350.  
  351. #elif (MAJOR_NR == NBD_MAJOR)
  352.  
  353. #define DEVICE_NAME "nbd"
  354. #define DEVICE_REQUEST do_nbd_request
  355. #define DEVICE_NR(device) (MINOR(device))
  356. #define DEVICE_ON(device) 
  357. #define DEVICE_OFF(device)
  358.  
  359. #endif /* MAJOR_NR == whatever */
  360.  
  361. #if (MAJOR_NR != SCSI_TAPE_MAJOR)
  362. #if !defined(IDE_DRIVER)
  363.  
  364. #ifndef CURRENT
  365. #define CURRENT (blk_dev[MAJOR_NR].current_request)
  366. #endif
  367.  
  368. #ifndef DEVICE_NAME
  369. #define DEVICE_NAME "unknown"
  370. #endif
  371.  
  372. #define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)
  373.  
  374. #ifdef DEVICE_INTR
  375. static void (*DEVICE_INTR)(void) = NULL;
  376. #endif
  377.  
  378. #ifdef DEVICE_TIMEOUT
  379.  
  380. #define SET_TIMER \
  381. ((timer_table[DEVICE_TIMEOUT].expires = jiffies + TIMEOUT_VALUE), \
  382. (timer_active |= 1<<DEVICE_TIMEOUT))
  383.  
  384. #define CLEAR_TIMER \
  385. timer_active &= ~(1<<DEVICE_TIMEOUT)
  386.  
  387. #define SET_INTR(x) \
  388. if ((DEVICE_INTR = (x)) != NULL) \
  389.     SET_TIMER; \
  390. else \
  391.     CLEAR_TIMER;
  392.  
  393. #else
  394.  
  395. #define SET_INTR(x) (DEVICE_INTR = (x))
  396.  
  397. #endif /* DEVICE_TIMEOUT */
  398.  
  399. static void (DEVICE_REQUEST)(void);
  400.   
  401. #ifdef DEVICE_INTR
  402. #define CLEAR_INTR SET_INTR(NULL)
  403. #else
  404. #define CLEAR_INTR
  405. #endif
  406.  
  407. #define INIT_REQUEST \
  408.     if (!CURRENT) {\
  409.         CLEAR_INTR; \
  410.         return; \
  411.     } \
  412.     if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \
  413.         panic(DEVICE_NAME ": request list destroyed"); \
  414.     if (CURRENT->bh) { \
  415.         if (!buffer_locked(CURRENT->bh)) \
  416.             panic(DEVICE_NAME ": block not locked"); \
  417.     }
  418.  
  419. #endif /* !defined(IDE_DRIVER) */
  420.  
  421. /*
  422.  * end_request() and friends. Must be called with the request queue spinlock
  423.  * acquired. All functions called within end_request() _must_be_ atomic.
  424.  *
  425.  * Several drivers define their own end_request and call end_that_request_first()
  426.  * and end_that_request_last() for parts of the original function. This prevents
  427.  * code duplication in drivers.
  428.  */
  429.  
  430. int end_that_request_first(struct request *req, int uptodate, char *name);
  431. void end_that_request_last(struct request *req);
  432.  
  433. #ifndef LOCAL_END_REQUEST    /* If we have our own end_request, we do not want to include this mess */
  434.  
  435. #if ! SCSI_BLK_MAJOR(MAJOR_NR)
  436.  
  437. static void end_request(int uptodate) {
  438.     struct request *req = CURRENT;
  439.  
  440.     if (end_that_request_first(req, uptodate, DEVICE_NAME))
  441.         return;
  442.  
  443. #ifndef DEVICE_NO_RANDOM
  444.     add_blkdev_randomness(MAJOR(req->rq_dev));
  445. #endif
  446.     DEVICE_OFF(req->rq_dev);
  447.     CURRENT = req->next;
  448.     end_that_request_last(req);
  449. }
  450.  
  451. #endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */
  452. #endif /* LOCAL_END_REQUEST */
  453.  
  454. #endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */
  455. #endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */
  456.  
  457. #endif /* _BLK_H */
  458.